/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sistemas.sisgear.controladores;

import com.sistemas.sisgear.entidades.Campo;
import com.sistemas.sisgear.entidades.Seccion;
import com.sistemas.sisgear.entidades.Template;
import com.sistemas.sisgear.negocio.PlantillaNegocio;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.faces.view.ViewScoped;
import org.primefaces.event.CellEditEvent;
import org.primefaces.event.FlowEvent;

/**
 *
 * @author Jorge
 */
@Named(value = "plantillaControlador")
@ViewScoped
public class PlantillaControlador implements Serializable {

    @EJB
    private PlantillaNegocio plantillaNegocio;

    private Template plantilla = new Template();
    private Seccion h1 = new Seccion("H", "1");
    private Seccion h2 = new Seccion("H", "2");
    private Seccion h3 = new Seccion("H", "3");
    private Seccion h4 = new Seccion("H", "4");
    private Seccion d = new Seccion("D", "0");
    private Seccion f1 = new Seccion("F", "1");
    private Seccion f2 = new Seccion("F", "2");
    private Seccion f3 = new Seccion("F", "3");
    private Seccion f4 = new Seccion("F", "4");

    //valores que selecciona el usuario en los combos de configurar plantilla
    private Integer nivel_header_seleccionado;
    private Integer nivel_footer_seleccionado;

    //lista que contiene los valores cogidos del archivo properties
    private List<Integer> valoresHeader = new ArrayList<>();

    //lista que contiene los valores temporales que almacena el footer en su
    //interaccion con el header
    private List<Integer> valoresFooter = new ArrayList<>();

    //el usuario marca el checkbox asociado
    private boolean marcaHeader;
    private boolean marcaDetail;
    private boolean marcaFooter;

    //el valor actual del combo que indica el nivel de que header o footer se esta
    //formateando los campos
    private Integer nivel_header_actual;
    private Integer nivel_footer_actual;

    //permite visualizar el componente fieldset asociado
    private boolean renderizaHeader1;
    private boolean renderizaHeader2;
    private boolean renderizaHeader3;
    private boolean renderizaHeader4;

    private boolean renderizaFooter1;
    private boolean renderizaFooter2;
    private boolean renderizaFooter3;
    private boolean renderizaFooter4;

    //tiene el valor del campo posible que se eligio del combo 
    //en el header deatil o footer
    private String campoPosibleSeleccionado_h1;
    private String campoPosibleSeleccionado_h2;
    private String campoPosibleSeleccionado_h3;
    private String campoPosibleSeleccionado_h4;

    private String campoPosibleSeleccionado_d;

    private String campoPosibleSeleccionado_f1;
    private String campoPosibleSeleccionado_f2;
    private String campoPosibleSeleccionado_f3;
    private String campoPosibleSeleccionado_f4;

    //lista que mantiene los campos que se estan formateando en la tabla de 
    //acuerdo al nivel para header detail o footer
    private List<Campo> camposAFormatear_h1 = new ArrayList();
    private List<Campo> camposAFormatear_h2 = new ArrayList();
    private List<Campo> camposAFormatear_h3 = new ArrayList();
    private List<Campo> camposAFormatear_h4 = new ArrayList();

    private List<Campo> camposAFormatear_d = new ArrayList();

    private List<Campo> camposAFormatear_f1 = new ArrayList();
    private List<Campo> camposAFormatear_f2 = new ArrayList();
    private List<Campo> camposAFormatear_f3 = new ArrayList();
    private List<Campo> camposAFormatear_f4 = new ArrayList();
    
    private Integer id_sec;
    private Integer id_camp;

    private int pos_t_h1 = 1;
    private int pos_t_h2 = 1;
    private int pos_t_h3 = 1;
    private int pos_t_h4 = 1;
    private int pos_t_d = 1;
    private int pos_t_f1 = 1;
    private int pos_t_f2 = 1;
    private int pos_t_f3 = 1;
    private int pos_t_f4 = 1;

    //referencia al archivo properties
    private ResourceBundle properties;

    /**
     * Creates a new instance of plantillaControlador
     */
    public PlantillaControlador() {
        cargarValoresHeader();
        nivel_footer_seleccionado = 0;
        nivel_header_seleccionado = 0;
        nivel_header_actual = 1;
        nivel_footer_actual = 1;
    }
    
    @PostConstruct
    public void init() {
        id_sec = plantillaNegocio.cantidadSecciones() + 1;
        id_camp = plantillaNegocio.cantidadCampos() + 1;
    }

    public List<Template> findAll() {
        return plantillaNegocio.findAll();
    }

    //metodos set y get
    public Template getPlantilla() {
        return plantilla;
    }

    public void setPlantilla(Template plantilla) {
        this.plantilla = plantilla;
    }

    public PlantillaNegocio getPlantillaNegocio() {
        return plantillaNegocio;
    }

    public void setPlantillaNegocio(PlantillaNegocio plantillaNegocio) {
        this.plantillaNegocio = plantillaNegocio;
    }

    public List<Integer> getValoresFooter() {
        return valoresFooter;
    }

    public void setValoresFooter(List<Integer> valoresFooter) {
        this.valoresFooter = valoresFooter;
    }

    public Integer getNivel_header_seleccionado() {
        return nivel_header_seleccionado;
    }

    public void setNivel_header_seleccionado(Integer nivel_header_seleccionado) {
        this.nivel_header_seleccionado = nivel_header_seleccionado;
    }

    public Integer getNivel_footer_seleccionado() {
        return nivel_footer_seleccionado;
    }

    public void setNivel_footer_seleccionado(Integer nivel_footer_seleccionado) {
        this.nivel_footer_seleccionado = nivel_footer_seleccionado;
    }

    public List<Integer> getValoresHeader() {
        return valoresHeader;
    }

    public void setValoresHeader(List<Integer> valoresHeader) {
        this.valoresHeader = valoresHeader;
    }

    public boolean isMarcaHeader() {
        return marcaHeader;
    }

    public void setMarcaHeader(boolean marcaHeader) {
        this.marcaHeader = marcaHeader;
    }

    public boolean isMarcaDetail() {
        return marcaDetail;
    }

    public void setMarcaDetail(boolean marcaDetail) {
        this.marcaDetail = marcaDetail;
    }

    public boolean isMarcaFooter() {
        return marcaFooter;
    }

    public void setMarcaFooter(boolean marcaFooter) {
        this.marcaFooter = marcaFooter;
    }

    public boolean isRenderizaHeader1() {
        return renderizaHeader1;
    }

    public void setRenderizaHeader1(boolean renderizaHeader1) {
        this.renderizaHeader1 = renderizaHeader1;
    }

    public boolean isRenderizaHeader2() {
        return renderizaHeader2;
    }

    public void setRenderizaHeader2(boolean renderizaHeader2) {
        this.renderizaHeader2 = renderizaHeader2;
    }

    public boolean isRenderizaHeader3() {
        return renderizaHeader3;
    }

    public void setRenderizaHeader3(boolean renderizaHeader3) {
        this.renderizaHeader3 = renderizaHeader3;
    }

    public boolean isRenderizaHeader4() {
        return renderizaHeader4;
    }

    public void setRenderizaHeader4(boolean renderizaHeader4) {
        this.renderizaHeader4 = renderizaHeader4;
    }

    public Integer getNivel_header_actual() {
        return nivel_header_actual;
    }

    public void setNivel_header_actual(Integer nive_header_actual) {
        this.nivel_header_actual = nive_header_actual;
    }

    public String getCampoPosibleSeleccionado_h1() {
        return campoPosibleSeleccionado_h1;
    }

    public void setCampoPosibleSeleccionado_h1(String campoPosibleSeleccionado_h1) {
        this.campoPosibleSeleccionado_h1 = campoPosibleSeleccionado_h1;
    }

    public String getCampoPosibleSeleccionado_h2() {
        return campoPosibleSeleccionado_h2;
    }

    public void setCampoPosibleSeleccionado_h2(String campoPosibleSeleccionado_h2) {
        this.campoPosibleSeleccionado_h2 = campoPosibleSeleccionado_h2;
    }

    public String getCampoPosibleSeleccionado_h3() {
        return campoPosibleSeleccionado_h3;
    }

    public void setCampoPosibleSeleccionado_h3(String campoPosibleSeleccionado_h3) {
        this.campoPosibleSeleccionado_h3 = campoPosibleSeleccionado_h3;
    }

    public String getCampoPosibleSeleccionado_h4() {
        return campoPosibleSeleccionado_h4;
    }

    public void setCampoPosibleSeleccionado_h4(String campoPosibleSeleccionado_h4) {
        this.campoPosibleSeleccionado_h4 = campoPosibleSeleccionado_h4;
    }

    public List<Campo> getCamposAFormatear_h1() {
        return camposAFormatear_h1;
    }

    public void setCamposAFormatear_h1(List<Campo> camposAFormatear) {
        this.camposAFormatear_h1 = camposAFormatear;
    }

    public List<Campo> getCamposAFormatear_h2() {
        return camposAFormatear_h2;
    }

    public void setCamposAFormatear_h2(List<Campo> camposAFormatear_h2) {
        this.camposAFormatear_h2 = camposAFormatear_h2;
    }

    public List<Campo> getCamposAFormatear_h3() {
        return camposAFormatear_h3;
    }

    public void setCamposAFormatear_h3(List<Campo> camposAFormatear_h3) {
        this.camposAFormatear_h3 = camposAFormatear_h3;
    }

    public List<Campo> getCamposAFormatear_h4() {
        return camposAFormatear_h4;
    }

    public void setCamposAFormatear_h4(List<Campo> camposAFormatear_h4) {
        this.camposAFormatear_h4 = camposAFormatear_h4;
    }

    public String getCampoPosibleSeleccionado_d() {
        return campoPosibleSeleccionado_d;
    }

    public void setCampoPosibleSeleccionado_d(String campoPosibleSeleccionado_d) {
        this.campoPosibleSeleccionado_d = campoPosibleSeleccionado_d;
    }

    public List<Campo> getCamposAFormatear_d() {
        return camposAFormatear_d;
    }

    public void setCamposAFormatear_d(List<Campo> camposAFormatear_d) {
        this.camposAFormatear_d = camposAFormatear_d;
    }

    public boolean isRenderizaFooter1() {
        return renderizaFooter1;
    }

    public void setRenderizaFooter1(boolean renderizaFooter1) {
        this.renderizaFooter1 = renderizaFooter1;
    }

    public boolean isRenderizaFooter2() {
        return renderizaFooter2;
    }

    public void setRenderizaFooter2(boolean renderizaFooter2) {
        this.renderizaFooter2 = renderizaFooter2;
    }

    public boolean isRenderizaFooter3() {
        return renderizaFooter3;
    }

    public void setRenderizaFooter3(boolean renderizaFooter3) {
        this.renderizaFooter3 = renderizaFooter3;
    }

    public boolean isRenderizaFooter4() {
        return renderizaFooter4;
    }

    public void setRenderizaFooter4(boolean renderizaFooter4) {
        this.renderizaFooter4 = renderizaFooter4;
    }

    public Integer getNivel_footer_actual() {
        return nivel_footer_actual;
    }

    public void setNivel_footer_actual(Integer nivel_footer_actual) {
        this.nivel_footer_actual = nivel_footer_actual;
    }

    public String getCampoPosibleSeleccionado_f1() {
        return campoPosibleSeleccionado_f1;
    }

    public void setCampoPosibleSeleccionado_f1(String campoPosibleSeleccionado_f1) {
        this.campoPosibleSeleccionado_f1 = campoPosibleSeleccionado_f1;
    }

    public String getCampoPosibleSeleccionado_f2() {
        return campoPosibleSeleccionado_f2;
    }

    public void setCampoPosibleSeleccionado_f2(String campoPosibleSeleccionado_f2) {
        this.campoPosibleSeleccionado_f2 = campoPosibleSeleccionado_f2;
    }

    public String getCampoPosibleSeleccionado_f3() {
        return campoPosibleSeleccionado_f3;
    }

    public void setCampoPosibleSeleccionado_f3(String campoPosibleSeleccionado_f3) {
        this.campoPosibleSeleccionado_f3 = campoPosibleSeleccionado_f3;
    }

    public String getCampoPosibleSeleccionado_f4() {
        return campoPosibleSeleccionado_f4;
    }

    public void setCampoPosibleSeleccionado_f4(String campoPosibleSeleccionado_f4) {
        this.campoPosibleSeleccionado_f4 = campoPosibleSeleccionado_f4;
    }

    public List<Campo> getCamposAFormatear_f1() {
        return camposAFormatear_f1;
    }

    public void setCamposAFormatear_f1(List<Campo> camposAFormatear_f1) {
        this.camposAFormatear_f1 = camposAFormatear_f1;
    }

    public List<Campo> getCamposAFormatear_f2() {
        return camposAFormatear_f2;
    }

    public void setCamposAFormatear_f2(List<Campo> camposAFormatear_f2) {
        this.camposAFormatear_f2 = camposAFormatear_f2;
    }

    public List<Campo> getCamposAFormatear_f3() {
        return camposAFormatear_f3;
    }

    public void setCamposAFormatear_f3(List<Campo> camposAFormatear_f3) {
        this.camposAFormatear_f3 = camposAFormatear_f3;
    }

    public List<Campo> getCamposAFormatear_f4() {
        return camposAFormatear_f4;
    }

    public void setCamposAFormatear_f4(List<Campo> camposAFormatear_f4) {
        this.camposAFormatear_f4 = camposAFormatear_f4;
    }

    //obtiene una referencia del archivo properties
    public ResourceBundle getProperties() {
        if (properties == null) {
            FacesContext context = FacesContext.getCurrentInstance();
            properties = context.getApplication().getResourceBundle(context, "msgs");
        }
        return properties;
    }

    //obtiene un valor especifico del archivo dado la clave
    public String obtenerValorProperties(String key) {
        String result;
        try {
            result = getProperties().getString(key);
        } catch (MissingResourceException e) {
            result = "???" + key + "??? not found";
        }
        return result;
    }

    //inicializa el combo header con valores del 0 (nivel)
    //hasta el valor especificado con la clave "max_header"
    //del archivo properties
    private void cargarValoresHeader() {
        valoresHeader.clear();
        Integer max = Integer.parseInt(obtenerValorProperties("max_header"));

        for (int i = 1; i <= max; i++) {
            valoresHeader.add(i);
        }
    }

    //actualizacion del footer cada vez que cambia el valor del combo header
    public void cambioNivelHeader() {
        valoresFooter.clear();
        for (int i = 1; i <= nivel_header_seleccionado; i++) {
            valoresFooter.add(i);
        }
    }

    //cambios que suceden luego de marcar/desmarcar header
    public void cambiaHeader() {
        marcaFooter = false; //esto ocasiona que cambie el combo footer a "disable"
        nivel_header_seleccionado = 0; // reinicia el combo header a "nivel"
    }

    //combo: nivel header actual 
    //carga la lista que tendra los headers elegidos
    public List<Integer> cargarNivelesHeaderSeleccionado() {
        List<Integer> list = new ArrayList();
        for (int i = 1; i <= nivel_header_seleccionado; i++) {
            list.add(i);
        }
        return list;
    }

    //muestra "Formato de Header de nivel x" donde x es el nivel especificado
    //en el combo: nivel header actual 
    public void renderizarNivelesHeader() {
        System.out.println(nivel_header_actual);

        if (nivel_header_actual.equals(1)) {
            renderizaHeader1 = true;
            renderizaHeader2 = false;
            renderizaHeader3 = false;
            renderizaHeader4 = false;
        } else if (nivel_header_actual.equals(2)) {
            renderizaHeader1 = false;
            renderizaHeader2 = true;
            renderizaHeader3 = false;
            renderizaHeader4 = false;
        } else if (nivel_header_actual.equals(3)) {
            renderizaHeader1 = false;
            renderizaHeader2 = false;
            renderizaHeader3 = true;
            renderizaHeader4 = false;
        } else if (nivel_header_actual.equals(4)) {
            renderizaHeader1 = false;
            renderizaHeader2 = false;
            renderizaHeader3 = false;
            renderizaHeader4 = true;
        }

    }

    //muestra "Formato de Footer de nivel x" donde x es el nivel especificado
    //en el combo: nivel footer actual 
    public void renderizarNivelesFooter() {
        System.out.println(nivel_footer_actual);

        if (nivel_footer_actual.equals(1)) {
            renderizaFooter1 = true;
            renderizaFooter2 = false;
            renderizaFooter3 = false;
            renderizaFooter4 = false;
        } else if (nivel_footer_actual.equals(2)) {
            renderizaFooter1 = false;
            renderizaFooter2 = true;
            renderizaFooter3 = false;
            renderizaFooter4 = false;
        } else if (nivel_footer_actual.equals(3)) {
            renderizaFooter1 = false;
            renderizaFooter2 = false;
            renderizaFooter3 = true;
            renderizaFooter4 = false;
        } else if (nivel_footer_actual.equals(4)) {
            renderizaFooter1 = false;
            renderizaFooter2 = false;
            renderizaFooter3 = false;
            renderizaFooter4 = true;
        }

    }

    //gestiona el movimiento entre pantallas dentro del wizard
    public String onFlowProcess(FlowEvent event) {

        FacesContext context = FacesContext.getCurrentInstance();

        System.out.println("El que pase : " + event.getOldStep());
        System.out.println("El paso actual: " + event.getNewStep());

        if (event.getOldStep().equals("conf_secciones") && ((event.getNewStep().equals("formato_header") || event.getNewStep().equals("formato_detail") || event.getNewStep().equals("formato_footer")) || event.getNewStep().equals("nombre_plantilla"))) {
            if (!marcaHeader && !marcaDetail) {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debe marcar header o detail para continuar", ""));
                return event.getOldStep();
            }

            if (marcaHeader && nivel_header_seleccionado.equals(0)) {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debe elegir un nivel de grupos de header para continuar", ""));
                return event.getOldStep();
            }

            if (marcaFooter && nivel_footer_seleccionado.equals(0)) {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debe elegir un nivel de grupos de footer para continuar", ""));
                return event.getOldStep();
            }

            //inicializa mostrando "Formato de Header de nivel 1" en la pantalla 
            renderizaHeader1 = true;
            renderizaHeader2 = false;
            renderizaHeader3 = false;
            renderizaHeader4 = false;

            //inicializa mostrando "Formato de Footer de nivel 1" en la pantalla 
            renderizaFooter1 = true;
            renderizaFooter2 = false;
            renderizaFooter3 = false;
            renderizaFooter4 = false;
        }

        return event.getNewStep();
    }

    //crea un campo y lo agrega a la tabla de campos del header 1
    public void agregarCampoFormateo_h1() {

        Campo c = new Campo(id_camp.toString(), 100L, "N", "C", "D", pos_t_h1, h1);
        c.setColumnaQ(campoPosibleSeleccionado_h1);
        camposAFormatear_h1.add(c);
        pos_t_h1++;
        id_camp++;
    }

    //crea un campo y lo agrega a la tabla de campos del header 2
    public void agregarCampoFormateo_h2() {
        Campo c = new Campo(id_camp.toString(), 100L, "N", "C", "D", pos_t_h2,h2);
        c.setColumnaQ(campoPosibleSeleccionado_h2);
        camposAFormatear_h2.add(c);
        pos_t_h2++;
        id_camp++;
    }

    //crea un campo y lo agrega a la tabla de campos del header 3
    public void agregarCampoFormateo_h3() {
        Campo c = new Campo(id_camp.toString(), 100L, "N", "C", "D", pos_t_h3,h3);
        c.setColumnaQ(campoPosibleSeleccionado_h3);
        camposAFormatear_h3.add(c);
        pos_t_h3++;
        id_camp++;
    }

    //crea un campo y lo agrega a la tabla de campos del header 4
    public void agregarCampoFormateo_h4() {
        Campo c = new Campo(id_camp.toString(), 100L, "N", "C", "D", pos_t_h4,h4);
        c.setColumnaQ(campoPosibleSeleccionado_h4);
        camposAFormatear_h4.add(c);
        pos_t_h4++;
        id_camp++;
    }

    //crea un campo y lo agrega a la tabla de campos del detail
    public void agregarCampoFormateo_d() {
        Campo c = new Campo(id_camp.toString(), 100L, "N", "C", "D", pos_t_d,d);
        c.setColumnaQ(campoPosibleSeleccionado_d);
        camposAFormatear_d.add(c);
        pos_t_d++;
        id_camp++;
    }

    //crea un campo y lo agrega a la tabla de campos del footer 1
    public void agregarCampoFormateo_f1() {
        Campo c = new Campo(id_camp.toString(), 100L, "N", "C", "D", pos_t_f1,f1);
        c.setColumnaQ(campoPosibleSeleccionado_f1);
        camposAFormatear_f1.add(c);
        pos_t_f1++;
        id_camp++;
    }

    //crea un campo y lo agrega a la tabla de campos del footer 2
    public void agregarCampoFormateo_f2() {
        Campo c = new Campo(id_camp.toString(), 100L, "N", "C", "D", pos_t_f2,f2);
        c.setColumnaQ(campoPosibleSeleccionado_f2);
        camposAFormatear_f2.add(c);
        pos_t_f2++;
        id_camp++;
    }

    //crea un campo y lo agrega a la tabla de campos del footer 3
    public void agregarCampoFormateo_f3() {
        Campo c = new Campo(id_camp.toString(), 100L, "N", "C", "D", pos_t_f3,f3);
        c.setColumnaQ(campoPosibleSeleccionado_f3);
        camposAFormatear_f3.add(c);
        pos_t_f3++;
        id_camp++;
    }

    //crea un campo y lo agrega a la tabla de campos del footer 4
    public void agregarCampoFormateo_f4() {
        Campo c = new Campo(id_camp.toString(), 100L, "N", "C", "D", pos_t_f4,f4);
        c.setColumnaQ(campoPosibleSeleccionado_f4);
        camposAFormatear_f4.add(c);
        pos_t_f4++;
        id_camp++;
    }

    //permite  editar una celda de la tabla de formateo de campos
    public void onCellEdit(CellEditEvent event) {
        Object oldValue = event.getOldValue();
        Object newValue = event.getNewValue();

        if (newValue != null && !newValue.equals(oldValue)) {
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Celda cambiada", "Valor anterior: " + oldValue + ", Valor nuevo:" + newValue);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    //metodo que tendra la logica para guardar una plantilla en BD
    public void registrarPlantilla() {

        Integer i = plantillaNegocio.cantidadPlantillas() + 1;
        Template temp = new Template(i.toString());

        ArrayList<Seccion> secciones = new ArrayList();

        if (marcaHeader) {
            if (nivel_header_seleccionado.equals(1)) {
                h1.setIdSeccion(id_sec.toString());
                h1.setIdTemplate(temp);
                h1.setCampoList(camposAFormatear_h1);
                
                id_sec++;
                secciones.add(h1);
            }

            if (nivel_header_seleccionado.equals(2)) {
                h1.setIdSeccion(id_sec.toString());
                h1.setIdTemplate(temp);
                h1.setCampoList(camposAFormatear_h1);
                
                id_sec++;
                
                h2.setIdSeccion(id_sec.toString());
                h2.setIdTemplate(temp);
                h2.setCampoList(camposAFormatear_h2);
                
                id_sec++;

                secciones.add(h1);
                secciones.add(h2);
            }
            if (nivel_header_seleccionado.equals(3)) {
                h1.setIdSeccion(id_sec.toString());
                h1.setIdTemplate(temp);
                h1.setCampoList(camposAFormatear_h1);
                id_sec++;
                
                h2.setIdSeccion(id_sec.toString());
                h2.setIdTemplate(temp);
                h2.setCampoList(camposAFormatear_h2);
                id_sec++;
                
                h3.setIdSeccion(id_sec.toString());
                h3.setIdTemplate(temp);
                h3.setCampoList(camposAFormatear_h3);  
                id_sec++;

                secciones.add(h1);
                secciones.add(h2);
                secciones.add(h3);
            }
            if (nivel_header_seleccionado.equals(4)) {
                h1.setIdSeccion(id_sec.toString());
                h1.setIdTemplate(temp);
                h1.setCampoList(camposAFormatear_h1);
                id_sec++;
                
                h2.setIdSeccion(id_sec.toString());
                h2.setIdTemplate(temp);
                h2.setCampoList(camposAFormatear_h2);
                id_sec++;
                
                h3.setIdSeccion(id_sec.toString());
                h3.setIdTemplate(temp);
                h3.setCampoList(camposAFormatear_h3);  
                id_sec++;
                
                h4.setIdSeccion(id_sec.toString());
                h4.setIdTemplate(temp);
                h4.setCampoList(camposAFormatear_h4);  
                id_sec++;
                
                secciones.add(h1);
                secciones.add(h2);
                secciones.add(h3);
                secciones.add(h4);
            }
        }

        if (marcaDetail) {
            d.setIdSeccion(id_sec.toString());
            d.setIdTemplate(temp);
            d.setCampoList(camposAFormatear_d);  
            id_sec++;
            secciones.add(d);
        }

        if (marcaFooter) {
            if (nivel_footer_seleccionado.equals(1)) {
                f1.setIdSeccion(id_sec.toString());
                f1.setIdTemplate(temp);
                f1.setCampoList(camposAFormatear_f1);
                id_sec++;
                secciones.add(f1);
            }

            if (nivel_footer_seleccionado.equals(2)) {
                f1.setIdSeccion(id_sec.toString());
                f1.setIdTemplate(temp);
                f1.setCampoList(camposAFormatear_f1);
                
                id_sec++;
                
                f2.setIdSeccion(id_sec.toString());
                f2.setIdTemplate(temp);
                f2.setCampoList(camposAFormatear_f2);
                
                id_sec++;

                secciones.add(f1);
                secciones.add(f2);
            }
            if (nivel_footer_seleccionado.equals(3)) {
                f1.setIdSeccion(id_sec.toString());
                f1.setIdTemplate(temp);
                f1.setCampoList(camposAFormatear_f1);
                id_sec++;
                
                f2.setIdSeccion(id_sec.toString());
                f2.setIdTemplate(temp);
                f2.setCampoList(camposAFormatear_f2);
                id_sec++;
                
                f3.setIdSeccion(id_sec.toString());
                f3.setIdTemplate(temp);
                f3.setCampoList(camposAFormatear_f3);  
                id_sec++;

                secciones.add(f1);
                secciones.add(f2);
                secciones.add(f3);
            }
            if (nivel_footer_seleccionado.equals(4)) {
                f1.setIdSeccion(id_sec.toString());
                f1.setIdTemplate(temp);
                f1.setCampoList(camposAFormatear_f1);
                id_sec++;
                
                f2.setIdSeccion(id_sec.toString());
                f2.setIdTemplate(temp);
                f2.setCampoList(camposAFormatear_f2);
                id_sec++;
                
                f3.setIdSeccion(id_sec.toString());
                f3.setIdTemplate(temp);
                f3.setCampoList(camposAFormatear_f3);  
                id_sec++;
                
                f4.setIdSeccion(id_sec.toString());
                f4.setIdTemplate(temp);
                f4.setCampoList(camposAFormatear_f4);  
                id_sec++;

                secciones.add(f1);
                secciones.add(f2);
                secciones.add(f3);
                secciones.add(f4);
            }
        }
        
        
        String fecha = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        temp.setNombre(plantilla.getNombre());
        temp.setAutor("Jorge");
        temp.setFecha(java.sql.Timestamp.valueOf(fecha));
        temp.setConsulta(plantilla.getConsulta());
        temp.setSeccionList(secciones);

        plantillaNegocio.guardarPlantilla(temp);



        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Exito", "Plantilla Registrada"));
    }

}
